package top.malaoshi.web.utils;

import javax.servlet.http.HttpServletRequest;

public class Ajax {

    /**
     * 判断是否ajax请求
     * @param request
     * @return
     */
    public static boolean isAjax(HttpServletRequest request){

        /*
         从请求头中取出accept，分以下情况：
         - 浏览器发请求，值是 text/html （一定，没有其他情况）
         - jquery、axios 等js框架，发送ajax请求，值为 application/json
         - 小程序（如：uni-app等）等，发送ajax请求，不发送该值，获取值为空字符串，具体看小程序规范

         注意：
          - 不跨域时，jquery、axios发请求，会携带该请求头，用下面代码可判断
          - 跨域时，axios发请求，accept头的值是 * / *，所以最好指定accept头，否则用下面代码判断可能不准确
         */
        String accept = request.getHeader("accept");
        if(accept == null || "".equals(accept) || accept.contains("application/json")){
            return true;
        }

        if(accept.contains("text/html")){
            return false;
        }
        /*
         有的js框架发ajax请求，会携带 x-requested-with 头，该头的值是 XMLHttpRequest
         注意：
          - 跨域时，服务器默认不允许携带该请求头，所以jquery、axios不会发该请求头，需要前端加该请求头，后端也需要允许跨域携带该请求头
          - 不跨域时，有的js框架，发请求时默认不发该请求头，如：axios

          总结：此方式变数太多，不可靠
         */
        String xRequestedWith=request.getHeader("x-requested-with");
        if(xRequestedWith!=null && "XMLHttpRequest".equalsIgnoreCase(xRequestedWith)){
            return true;
        }

        return false;
    }
}
